class Observer {
  constructor(data) {
    // 遍历用户传递的参数，进行观测（vue2消耗性能的一个地方）
    this.walk(data);
  }

  walk(data) {
    const keys = Object.keys(data);
    keys.forEach(key => {
      defineReactive(data, key, data[key]);
    })
  }
}

// Vue2 的响应式原理的核心方法 defineReactive
function defineReactive(data, key, value) {

  observe(value); // 递归深度遍历属性，进行观测（vue2消耗性能的一个地方）
  Object.defineProperty(data, key, {
    get() {
      console.log('get')
      return value;
    },
    set(newValue) {
      console.log('set')
      // 如果用户通过 vm 设置属性，也进行观测,实现响应式
      observe(newValue);

      if (newValue === value) return;
      value = newValue;

    }
  });
}

export function observe(data) {
  // 不是对象，或者为 null / undefined 就返回
  if (typeof data !== "object" || data == null) return;

  // __ob__ 标识是否已经被观测过


  return new Observer(data);
}